package pe.com.bbva.modpre.persistencia.hibernate;

import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.Map;

import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang.math.NumberUtils;
import org.hibernate.Hibernate;
import org.hibernate.SessionFactory;
import org.hibernate.criterion.CriteriaSpecification;
import org.hibernate.criterion.MatchMode;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Restrictions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;

import pe.com.bbva.modpre.dominio.Cliente;
import pe.com.bbva.modpre.dominio.Equipo;
import pe.com.bbva.modpre.dominio.Estado;
import pe.com.bbva.modpre.dominio.Operacion;
import pe.com.bbva.modpre.dominio.Producto;
import pe.com.bbva.modpre.dominio.Rol;
import pe.com.bbva.modpre.dominio.Segmento;
import pe.com.bbva.modpre.dominio.Situacion;
import pe.com.bbva.modpre.dominio.Solicitud;
import pe.com.bbva.modpre.dominio.TipoBanca;
import pe.com.bbva.modpre.dominio.Usuario;
import pe.com.bbva.modpre.dominio.Valor;
import pe.com.bbva.modpre.negocio.impl.SolicitudServiceImpl;
import pe.com.bbva.modpre.persistencia.OperacionDAO;
import pe.com.bbva.modpre.persistencia.UsuarioDAO;
import pe.com.bbva.modpre.utileria.Busqueda;
import pe.com.bbva.modpre.utileria.ModpreUtil;

@Repository
@SuppressWarnings("serial")
public class OperacionHibernate extends BaseHibernate<Operacion, Long> 
implements OperacionDAO{
	

	@Value("${jdbc.schema}")
	private String schema;

	@Autowired
	private JdbcTemplate jdbcTemplate;
	
	public String obtenerObjetoBBDD(String objetoBBDD) {
		return schema+"."+objetoBBDD;
	}
	
	@Autowired
	public OperacionHibernate(SessionFactory sessionFactory) {
		setSessionFactory(sessionFactory);
	}

	@Override
	public List<Operacion> operacionesDelMes(Date inicio, Date fin, String estado) {
		long est =  Long.parseLong(estado);
		  
		return buscarHql("select o from Operacion o where estado.id=? and creacion>=? and creacion<=? order by solicitud",est,inicio,fin);
		
	}

	@Override
	@SuppressWarnings("deprecation")
	public List<Operacion> busquedaFiltrada(Map<String, Object> mapFiltro) {
		Usuario usuario=ModpreUtil.obtenerUsuarioSesion();
		List<String> alias=new ArrayList<String>();
		Busqueda filtro = Busqueda.forClass(Operacion.class);
		if(mapFiltro.containsKey("nroSolicitud") && StringUtils.isNotBlank((String)mapFiltro.get("nroSolicitud"))){
			filtro.createAlias("solicitud", "s");
			alias.add("s");
			filtro.add(Restrictions.ilike("s.numero",(String)mapFiltro.get("nroSolicitud"), MatchMode.ANYWHERE));
		}
		if(mapFiltro.containsKey("nroSolicitud") && StringUtils.isNotBlank((String)mapFiltro.get("nroSolicitud"))){
			if(!alias.contains("s")){
				filtro.createAlias("solicitud", "s");
				alias.add("s");
			}
			filtro.add(Restrictions.ilike("s.numero",(String)mapFiltro.get("nroSolicitud"), MatchMode.ANYWHERE));
		}
		if(mapFiltro.containsKey("operacion") && StringUtils.isNotBlank((String)mapFiltro.get("operacion"))){
			filtro.createAlias("tipoOperacion", "o");
			alias.add("o");
			filtro.add(Restrictions.ilike("o.nombre",(String)mapFiltro.get("operacion"), MatchMode.ANYWHERE));
		}
		if(mapFiltro.containsKey("producto") && StringUtils.isNotBlank((String)mapFiltro.get("producto"))){
			filtro.createAlias("producto", "p");
			alias.add("p");
			filtro.add(Restrictions.ilike("p.nombre",(String)mapFiltro.get("producto"), MatchMode.ANYWHERE));
		}
		if(mapFiltro.containsKey("moneda") && StringUtils.isNotBlank((String)mapFiltro.get("moneda"))){
			filtro.createAlias("moneda", "m");
			alias.add("m");
			filtro.add(Restrictions.ilike("m.nombre",(String)mapFiltro.get("moneda"), MatchMode.ANYWHERE));
		}
		if(mapFiltro.containsKey("monto_1") && StringUtils.isNotBlank((String)mapFiltro.get("monto_1")) 
				&& NumberUtils.isNumber((String)mapFiltro.get("monto_1"))){
			filtro.add(Restrictions.ge("montoCredito",new BigDecimal((String)mapFiltro.get("monto_1"))));
		}
		if(mapFiltro.containsKey("monto_2") && StringUtils.isNotBlank((String)mapFiltro.get("monto_2"))
				&& NumberUtils.isNumber((String)mapFiltro.get("monto_2"))){
			filtro.add(Restrictions.le("montoCredito",new BigDecimal((String)mapFiltro.get("monto_2"))));
		}
		if(mapFiltro.containsKey("plazo_1") && StringUtils.isNotBlank((String)mapFiltro.get("plazo_1")) 
				&& NumberUtils.isNumber((String)mapFiltro.get("plazo_1"))){
			filtro.add(Restrictions.ge("plazo",new BigDecimal((String)mapFiltro.get("plazo_1"))));
		}
		if(mapFiltro.containsKey("plazo_2") && StringUtils.isNotBlank((String)mapFiltro.get("plazo_2"))
				&& NumberUtils.isNumber((String)mapFiltro.get("plazo_2"))){
			filtro.add(Restrictions.le("plazo",new BigDecimal((String)mapFiltro.get("plazo_2"))));
		}
		if(mapFiltro.containsKey("codigoCentral") && StringUtils.isNotBlank((String)mapFiltro.get("codigoCentral"))){
			if(!alias.contains("s")){
				filtro.createAlias("solicitud", "s");
				alias.add("s");
			}
			if(!alias.contains("c")){
				filtro.createAlias("s.cliente", "c");
				alias.add("c");	
			}
			filtro.add(Restrictions.ilike("c.codigo",(String)mapFiltro.get("codigoCentral"), MatchMode.ANYWHERE));
		}
		if(mapFiltro.containsKey("cliente") && StringUtils.isNotBlank((String)mapFiltro.get("cliente"))){
			if(!alias.contains("s")){
				filtro.createAlias("solicitud", "s");
				alias.add("s");
			}
			Busqueda filtroCliente = filtro.createCriteria("s.cliente");
			filtroCliente.add(Restrictions.sqlRestriction("lower({alias}.nombres||' '||{alias}.paterno||' '||{alias}.materno) like lower(?)", "%"+((String)mapFiltro.get("cliente")).trim()+"%",Hibernate.STRING));
		}
		if(mapFiltro.containsKey("tipoDOI") && StringUtils.isNotBlank((String)mapFiltro.get("tipoDOI"))){
			if(!alias.contains("s")){
				filtro.createAlias("solicitud", "s");
				alias.add("s");
			}
			if(!alias.contains("c")){
				filtro.createAlias("s.cliente", "c");
				alias.add("c");	
			}
			filtro.createAlias("c.tipoDoi", "tDoi");
			alias.add("tDoi");
			filtro.add(Restrictions.ilike("tDoi.nombre",(String)mapFiltro.get("tipoDOI"), MatchMode.ANYWHERE));
		}
		if(mapFiltro.containsKey("DOI") && StringUtils.isNotBlank((String)mapFiltro.get("DOI"))){
			if(!alias.contains("s")){
				filtro.createAlias("solicitud", "s");
				alias.add("s");
			}
			if(!alias.contains("c")){
				filtro.createAlias("s.cliente", "c");
				alias.add("c");	
			}
			filtro.add(Restrictions.ilike("c.doi",(String)mapFiltro.get("DOI"), MatchMode.ANYWHERE));
		}
		if(mapFiltro.containsKey("fechaRegistro_1") && mapFiltro.containsKey("fechaRegistro_2") && 
				mapFiltro.get("fechaRegistro_1")!=null && mapFiltro.get("fechaRegistro_2")!=null){
			Calendar desde=Calendar.getInstance();
			desde.setTime((Date)mapFiltro.get("fechaRegistro_1"));
			desde.set(Calendar.HOUR_OF_DAY, 0);
			desde.set(Calendar.MINUTE, 0);
			desde.set(Calendar.SECOND, 0);
			desde.set(Calendar.MILLISECOND, 0);
			Calendar hasta=Calendar.getInstance();
			hasta.setTime((Date)mapFiltro.get("fechaRegistro_2"));
			hasta.set(Calendar.HOUR_OF_DAY, 23);
			hasta.set(Calendar.MINUTE, 59);
			hasta.set(Calendar.SECOND, 59);
			hasta.set(Calendar.MILLISECOND, 999);
			filtro.add(Restrictions.between("creacion", desde.getTime(), 
					hasta.getTime()));
		}
		if(mapFiltro.containsKey("estado") && StringUtils.isNotBlank((String)mapFiltro.get("estado"))){
			if(!alias.contains("s")){
				filtro.createAlias("solicitud", "s");
				alias.add("s");
			}
			filtro.createAlias("s.estado", "e");
			alias.add("e");
			filtro.add(Restrictions.ilike("e.nombre",(String)mapFiltro.get("estado"), MatchMode.ANYWHERE));
		}
		if(mapFiltro.containsKey("situacion") && StringUtils.isNotBlank((String)mapFiltro.get("situacion"))){
			filtro.createAlias("situacion", "si");
			alias.add("si");
			filtro.add(Restrictions.ilike("si.nombre",(String)mapFiltro.get("situacion"), MatchMode.ANYWHERE));
		}
		if(!alias.contains("s")){
			filtro.createAlias("solicitud", "s");
			alias.add("s");
		}
		filtro.createAlias("s.responsable", "r");
		filtro.createAlias("responsable", "ro");
		filtro.createAlias("s.creador", "cre",CriteriaSpecification.LEFT_JOIN);
		filtro.add(Restrictions.eq("r.id", usuario.getId()));
		filtro.add(Restrictions.eq("ro.id", usuario.getId()));
		filtro.addOrder(Order.asc("solicitud"));
		filtro.addOrder(Order.asc("id"));
		return buscar(filtro);
	}

	@Override
	@SuppressWarnings({ "deprecation"})
	public List<Operacion> busquedaFiltradaBandeja(Map<String, Object> mapFiltro) {
		Usuario usuario=ModpreUtil.obtenerUsuarioSesion();
		List<String> alias=new ArrayList<String>();
		Busqueda filtro = Busqueda.forClass(Operacion.class);
		filtro.createAlias("equipo", "eq");
		alias.add("eq");
		if(mapFiltro.containsKey("nroSolicitud") && StringUtils.isNotBlank((String)mapFiltro.get("nroSolicitud"))){
			filtro.createAlias("solicitud", "s");
			alias.add("s");
			filtro.add(Restrictions.ilike("s.numero",(String)mapFiltro.get("nroSolicitud"), MatchMode.ANYWHERE));
		}
		if(mapFiltro.containsKey("segmento") && StringUtils.isNotBlank((String)mapFiltro.get("segmento"))){
			if(!alias.contains("s")){
				filtro.createAlias("solicitud", "s");
				alias.add("s");
			}
			if(!alias.contains("seg")){
				filtro.createAlias("s.segmento", "seg");
				alias.add("seg");	
			}
			filtro.add(Restrictions.ilike("seg.nombre",(String)mapFiltro.get("segmento"), MatchMode.ANYWHERE));
		}
		if(mapFiltro.containsKey("nroSolicitud") && StringUtils.isNotBlank((String)mapFiltro.get("nroSolicitud"))){
			if(!alias.contains("s")){
				filtro.createAlias("solicitud", "s");
				alias.add("s");
			}
			filtro.add(Restrictions.ilike("s.numero",(String)mapFiltro.get("nroSolicitud"), MatchMode.ANYWHERE));
		}
		if(mapFiltro.containsKey("operacion") && StringUtils.isNotBlank((String)mapFiltro.get("operacion"))){
			filtro.createAlias("tipoOperacion", "o");
			alias.add("o");
			filtro.add(Restrictions.ilike("o.nombre",(String)mapFiltro.get("operacion"), MatchMode.ANYWHERE));
		}
		if(mapFiltro.containsKey("producto") && StringUtils.isNotBlank((String)mapFiltro.get("producto"))){
			filtro.createAlias("producto", "p");
			alias.add("p");
			filtro.add(Restrictions.ilike("p.nombre",(String)mapFiltro.get("producto"), MatchMode.ANYWHERE));
		}
		if(mapFiltro.containsKey("moneda") && StringUtils.isNotBlank((String)mapFiltro.get("moneda"))){
			filtro.createAlias("moneda", "m");
			alias.add("m");
			filtro.add(Restrictions.ilike("m.nombre",(String)mapFiltro.get("moneda"), MatchMode.ANYWHERE));
		}
		if(mapFiltro.containsKey("monto_1") && StringUtils.isNotBlank((String)mapFiltro.get("monto_1")) 
				&& NumberUtils.isNumber((String)mapFiltro.get("monto_1"))){
			filtro.add(Restrictions.ge("montoCredito",new BigDecimal((String)mapFiltro.get("monto_1"))));
		}
		if(mapFiltro.containsKey("monto_2") && StringUtils.isNotBlank((String)mapFiltro.get("monto_2"))
				&& NumberUtils.isNumber((String)mapFiltro.get("monto_2"))){
			filtro.add(Restrictions.le("montoCredito",new BigDecimal((String)mapFiltro.get("monto_2"))));
		}
		if(mapFiltro.containsKey("plazo_1") && StringUtils.isNotBlank((String)mapFiltro.get("plazo_1")) 
				&& NumberUtils.isNumber((String)mapFiltro.get("plazo_1"))){
			filtro.add(Restrictions.ge("plazo",new BigDecimal((String)mapFiltro.get("plazo_1"))));
		}
		if(mapFiltro.containsKey("plazo_2") && StringUtils.isNotBlank((String)mapFiltro.get("plazo_2"))
				&& NumberUtils.isNumber((String)mapFiltro.get("plazo_2"))){
			filtro.add(Restrictions.le("plazo",new BigDecimal((String)mapFiltro.get("plazo_2"))));
		}
		if(mapFiltro.containsKey("codigoCentral") && StringUtils.isNotBlank((String)mapFiltro.get("codigoCentral"))){
			if(!alias.contains("s")){
				filtro.createAlias("solicitud", "s");
				alias.add("s");
			}
			if(!alias.contains("c")){
				filtro.createAlias("s.cliente", "c");
				alias.add("c");	
			}
			filtro.add(Restrictions.ilike("c.codigoCentral",(String)mapFiltro.get("codigoCentral"), MatchMode.ANYWHERE));
		}
		if(mapFiltro.containsKey("cliente") && StringUtils.isNotBlank((String)mapFiltro.get("cliente"))){
			if(!alias.contains("s")){
				filtro.createAlias("solicitud", "s");
				alias.add("s");
			}
			Busqueda filtroCliente = filtro.createCriteria("s.cliente");
			filtroCliente.add(Restrictions.sqlRestriction("lower({alias}.nombres||' '||{alias}.paterno||' '||{alias}.materno) like lower(?)", "%"+((String)mapFiltro.get("cliente")).trim()+"%",Hibernate.STRING));
		}
		if(mapFiltro.containsKey("tipoDOI") && StringUtils.isNotBlank((String)mapFiltro.get("tipoDOI"))){
			if(!alias.contains("s")){
				filtro.createAlias("solicitud", "s");
				alias.add("s");
			}
			if(!alias.contains("c")){
				filtro.createAlias("s.cliente", "c");
				alias.add("c");	
			}
			filtro.createAlias("c.tipoDoi", "tDoi");
			alias.add("tDoi");
			filtro.add(Restrictions.ilike("tDoi.nombre",(String)mapFiltro.get("tipoDOI"), MatchMode.ANYWHERE));
		}
		if(mapFiltro.containsKey("DOI") && StringUtils.isNotBlank((String)mapFiltro.get("DOI"))){
			if(!alias.contains("s")){
				filtro.createAlias("solicitud", "s");
				alias.add("s");
			}
			if(!alias.contains("c")){
				filtro.createAlias("s.cliente", "c");
				alias.add("c");	
			}
			filtro.add(Restrictions.ilike("c.doi",(String)mapFiltro.get("DOI"), MatchMode.ANYWHERE));
		}
		if(mapFiltro.containsKey("fechaRegistro_1") && mapFiltro.containsKey("fechaRegistro_2") && 
				mapFiltro.get("fechaRegistro_1")!=null && mapFiltro.get("fechaRegistro_2")!=null){
			Calendar desde=Calendar.getInstance();
			desde.setTime((Date)mapFiltro.get("fechaRegistro_1"));
			desde.set(Calendar.HOUR_OF_DAY, 0);
			desde.set(Calendar.MINUTE, 0);
			desde.set(Calendar.SECOND, 0);
			desde.set(Calendar.MILLISECOND, 0);
			Calendar hasta=Calendar.getInstance();
			hasta.setTime((Date)mapFiltro.get("fechaRegistro_2"));
			hasta.set(Calendar.HOUR_OF_DAY, 23);
			hasta.set(Calendar.MINUTE, 59);
			hasta.set(Calendar.SECOND, 59);
			hasta.set(Calendar.MILLISECOND, 999);
			filtro.add(Restrictions.between("creacion", desde.getTime(), 
					hasta.getTime()));
		}
		if(mapFiltro.containsKey("estado") && StringUtils.isNotBlank((String)mapFiltro.get("estado"))){
			if(!alias.contains("s")){
				filtro.createAlias("solicitud", "s");
				alias.add("s");
			}
			filtro.createAlias("s.estado", "e");
			alias.add("e");
			filtro.add(Restrictions.ilike("e.nombre",(String)mapFiltro.get("estado"), MatchMode.ANYWHERE));
		}
		if(mapFiltro.containsKey("situacion") && StringUtils.isNotBlank((String)mapFiltro.get("situacion"))){
			filtro.createAlias("situacion", "si");
			alias.add("si");
			filtro.add(Restrictions.ilike("si.nombre",(String)mapFiltro.get("situacion"), MatchMode.ANYWHERE));
		}
		if(!alias.contains("s")){
			filtro.createAlias("solicitud", "s");
			alias.add("s");
		}
		if(!alias.contains("e")){
			filtro.createAlias("s.estado", "e");
			alias.add("e");
		}
		filtro.add(Restrictions.ne("e.codigo", Estado.CODIGO.CERRADO));
		if(!(usuario.getEquipo().getCodigo().equals(Equipo.CODIGO.EJE_BEC) || 
				usuario.getEquipo().getCodigo().equals(Equipo.CODIGO.EJE_MIN))){
			filtro.add(Restrictions.ne("e.codigo", Estado.CODIGO.PRE_REGISTRO));
		}
		if(usuario.getEquipo().getConfiguracion().getCodigo().equals(Valor.CODIGO.MIS_SOL)){
			filtro.createAlias("s.responsable", "r");
			filtro.createAlias("s.responsableAnterior", "ra", CriteriaSpecification.LEFT_JOIN);
			filtro.createAlias("s.creador", "cre",CriteriaSpecification.LEFT_JOIN);
			filtro.add(Restrictions.or(Restrictions.eq("r.id", usuario.getId()), 
					Restrictions.or(Restrictions.eq("ra.id", usuario.getId()), 
							Restrictions.eq("cre.id", usuario.getId()))));
			
		}
		
		if(usuario.getEquipo().getConfiguracion().getCodigo().equals(Valor.CODIGO.SOL_EQU)){
//			filtro.createAlias("s.equipo", "eq");
			filtro.createAlias("s.equipoAnterior", "eqa", CriteriaSpecification.LEFT_JOIN);
			filtro.createAlias("s.creador", "cre",CriteriaSpecification.LEFT_JOIN);
			filtro.add(Restrictions.or(Restrictions.eq("eq.id", usuario.getEquipo().getId()), 
					Restrictions.or(Restrictions.eq("eqa.id", usuario.getEquipo().getId()), 
							Restrictions.eq("cre.id", usuario.getId()))));
		}
		
		if(usuario.getEquipo().getConfiguracion().getCodigo().equals(Valor.CODIGO.MIS_SOL_SUB_EQU)){
			filtro.createAlias("s.responsable", "r");
			filtro.createAlias("s.responsableAnterior", "ra", CriteriaSpecification.LEFT_JOIN);
//			filtro.createCriteria("s.equipo", "eq");
			filtro.createCriteria("s.equipoAnterior", "eqa", CriteriaSpecification.LEFT_JOIN);
			filtro.createAlias("s.creador", "cre",CriteriaSpecification.LEFT_JOIN);
			Object[] equipos=(Object[])mapFiltro.get("equipos");
			if(equipos!=null){
				filtro.add(Restrictions.or(Restrictions.eq("r.id", usuario.getId()), 
						Restrictions.or(Restrictions.eq("ra.id", usuario.getId()), 
								Restrictions.or(Restrictions.eq("cre.id", usuario.getId()), 
										Restrictions.or(Restrictions.in("eq.codigo", equipos), 
												Restrictions.in("eqa.codigo", equipos))))));
			}else{
				filtro.add(Restrictions.or(Restrictions.eq("r.id", usuario.getId()), 
						Restrictions.or(Restrictions.eq("ra.id", usuario.getId()), 
							Restrictions.eq("cre.id", usuario.getId()))));
			}
		}
		
		if(usuario.getEquipo().getConfiguracion().getCodigo().equals(Valor.CODIGO.SOL_EQU_SUB_EQU)){
//			filtro.createAlias("s.equipo", "eq");
			filtro.createAlias("s.equipoAnterior", "eqa", CriteriaSpecification.LEFT_JOIN);
			filtro.createAlias("s.creador", "cre",CriteriaSpecification.LEFT_JOIN);
			Object[] equipos=(Object[])mapFiltro.get("equipos");
			if(equipos!=null){
				filtro.add(Restrictions.or(Restrictions.eq("eq.id", usuario.getEquipo().getId()), 
						Restrictions.or(Restrictions.eq("eqa.id", usuario.getEquipo().getId()), 
								Restrictions.or(Restrictions.eq("cre.id", usuario.getId()), 
										Restrictions.or(Restrictions.in("eq.codigo", equipos), 
												Restrictions.in("eqa.codigo", equipos))))));
			}else{
				filtro.add(Restrictions.or(Restrictions.eq("eq.id", usuario.getEquipo().getId()), 
						Restrictions.or(Restrictions.eq("eqa.id", usuario.getEquipo().getId()), 
							Restrictions.eq("cre.id", usuario.getId()))));
			}
		}
		
		if(mapFiltro.containsKey("oficina") && StringUtils.isNotBlank((String)mapFiltro.get("oficina"))){
		filtro.add(Restrictions.eq("cre.oficina", usuario.getOficina()));
		}
		if(mapFiltro.containsKey("equipo") && StringUtils.isNotBlank((String)mapFiltro.get("equipo"))){
			filtro.add(Restrictions.ilike("eq.nombre",(String)mapFiltro.get("equipo"), MatchMode.ANYWHERE));
		}
		filtro.addOrder(Order.desc("solicitud"));
		filtro.addOrder(Order.asc("id"));
		return buscar(filtro);
	}
	
	@Override
	public List<Operacion> operacionxSolicitud(Solicitud solicitud) {
		Busqueda filtro = Busqueda.forClass(Operacion.class);
		filtro.createAlias("solicitud", "s");
		filtro.add(Restrictions.eq("s.numero",solicitud.getNumero()));
		filtro.createAlias("creador", "cre",CriteriaSpecification.LEFT_JOIN);
		filtro.createAlias("editor", "edi",CriteriaSpecification.LEFT_JOIN);
		filtro.addOrder(Order.asc("id"));
		return buscar(filtro);
		//return buscarHql("select o from Operacion o left join o.creador left join o.editor where o.solicitud.numero like(?)",solicitud.getNumero());
	}

	@Override
	public List<Operacion> listaOperacionesxResponsable(Usuario usuario) {
		
		long a= usuario.getId();
		return buscarHql("select s from Operacion s where responsable.id=? and solicitud.estado.codigo!='CERRADO' and (situacion.codigo='SOL' or situacion.codigo='ELE' or situacion.codigo='SUB' or situacion.codigo='REC') ",a);
	}

	@Override
	public List<Operacion> operacionExpirar() {
		Date fecActual = new Date();
		return buscarHql("select o from Operacion o where fechaVigenciaTasa<=? order by solicitud",fecActual);
			
	}

	@Override
	public List<Operacion> operacionFechaVigencia(List<Long> listaId) {
		
		return buscarHqlParametro("select o from Operacion o where solicitud.id in (:listaId)",new String[]{"listaId"},
				new Object[]{listaId});	
	}

	@Override
	public List<Operacion> buscarOperacionesSolicitudResponsable(
			Solicitud solicitud, Usuario responsable) {
		return buscarHql("select o from Operacion o where solicitud.id=? and responsable.id=?", solicitud.getId(), responsable.getId());
	}

	@Override
	public List<Operacion> buscarOperacionesSolicitudEquipo(
			Solicitud solicitud, Equipo equipo) {
		return buscarHql("select o from Operacion o where solicitud.id=? and equipo.id=?", solicitud.getId(), equipo.getId());
	}

	@Override
	public List<Operacion> buscarOperacionesFiltrosReporte(Map<String, Object> mapFiltroReporte,Map<String, Object> mapFiltroTabla,TipoBanca tipobanca) {
		StringBuilder sql=new StringBuilder();
		SimpleDateFormat fmt = new SimpleDateFormat("dd/MM/yy");
		sql.append("select o.*,s.*,s.id id_solicitud,s.numero numero_solicitud,seg.nombre SEGMENTO_NOMBRE,doi.nombre DOI_NOMBRE,"
				+ "cli.codigo_central COD_CENTRAL_CLIENTE,cli.nombres||' '||cli.paterno||' '||cli.materno NOMBRE_CLIENTE,"
				+ "sit.nombre NOMBRE_SITUACION,m.nombre MONEDA_NOMBRE,p.nombre PRODUCTO_NOMBRE,"
				+ "o.plazo||'-'||tp.nombre NOMBRE_TIPO_PLAZO from "+ obtenerObjetoBBDD("sol_operacion o "));
		sql.append("inner join "+obtenerObjetoBBDD("sol_solicitud s ")+"on o.solicitud=s.id ");
		sql.append("inner join "+obtenerObjetoBBDD("sol_producto p ")+"on o.producto=p.id ");
		
		sql.append("inner join "+obtenerObjetoBBDD("seg_usuario usu ")+"on usu.id=o.creador ");
		sql.append("inner join "+obtenerObjetoBBDD("seg_membresia memb ")+"on usu.registro=memb.valor ");
		sql.append("inner join "+obtenerObjetoBBDD("seg_rol ro ")+"on ro.id=memb.rol ");
		sql.append("inner join "+obtenerObjetoBBDD("org_integrante ig ")+"on ig.usuario=usu.id ");
		sql.append("inner join "+obtenerObjetoBBDD("org_equipo eq ")+"on eq.id=ig.equipo ");
		
		sql.append("inner join "+obtenerObjetoBBDD("cfg_valor m ")+"on o.moneda=m.id ");
		sql.append("inner join "+obtenerObjetoBBDD("cfg_valor ofi ")+"on s.codigo_oficina=ofi.codigo ");
		sql.append("inner join "+obtenerObjetoBBDD("cfg_valor ter ")+"on s.codigo_region_territorio=ter.codigo ");
		sql.append("inner join "+obtenerObjetoBBDD("cfg_valor tp ")+"on o.tipo_plazo=tp.id ");
		sql.append("left join "+obtenerObjetoBBDD("cli_segmento seg ")+"on s.segmento= seg.id ");
		sql.append("inner join "+obtenerObjetoBBDD("sol_situacion sit ")+"on o.situacion=sit.id ");
		sql.append("inner join "+obtenerObjetoBBDD("cli_cliente cli ")+"on s.cliente=cli.id ");
		sql.append("inner join "+obtenerObjetoBBDD("cfg_valor doi ")+"on cli.tipo_doi=doi.id ");
		
				
		sql.append("where '1'='1'");
		Usuario uSesion=ModpreUtil.obtenerUsuarioSesion();
		if(!uSesion.getRol().getCodigo().equals(Rol.CODIGO.ADMIN)){
			sql.append(" and( s.tipo_banca='"+tipobanca.getId()+"')");
		}
		if(uSesion.getRol().getCodigo().equals(Rol.CODIGO.EJE_BEC)){
			sql.append(" and( s.creador='"+uSesion.getId()+"')");
		}
		if(uSesion.getRol().getCodigo().equals(Rol.CODIGO.EJE_MIN)){
			sql.append(" and( s.creador='"+uSesion.getId()+"')");	
		}
		if(uSesion.getRol().getCodigo().equals(Rol.CODIGO.ANA_BEC)||uSesion.getRol().getCodigo().equals(Rol.CODIGO.ANA_MIN)||uSesion.getRol().getCodigo().equals(Rol.CODIGO.RES_BEC)||uSesion.getRol().getCodigo().equals(Rol.CODIGO.RES_MIN)){
			sql.append(" and( sit.codigo!='"+Situacion.CODIGO.PRE_REGISTRO+"')");	
		}
		
		
		if(uSesion.getRol().getCodigo().equals(Rol.CODIGO.GER_OFI_TER)){
			sql.append(" and( ig.superior='"+ uSesion.getId()+"')");
			sql.append(" and( ro.codigo='"+Rol.CODIGO.EJE_MIN +"')");	
		}
		if(uSesion.getRol().getCodigo().equals(Rol.CODIGO.GER_OFI_REG)){
			sql.append(" and( ig.superior='"+ uSesion.getId()+"')");
			sql.append(" and( ro.codigo='"+Rol.CODIGO.EJE_BEC +"')");	
		}
		
		
		if(uSesion.getRol().getCodigo().equals(Rol.CODIGO.GER_TER)){
			sql.append(" and( ro.codigo='"+Rol.CODIGO.EJE_MIN +"')");
			sql.append(" and( s.codigo_region_territorio='"+uSesion.getRegionTerritorio() +"')");
		}
		if(uSesion.getRol().getCodigo().equals(Rol.CODIGO.GER_REG)){
			sql.append(" and( ro.codigo='"+Rol.CODIGO.EJE_BEC +"')");
			sql.append(" and( s.codigo_region_territorio='"+uSesion.getRegionTerritorio() +"')");
		}
		
		
		
		if(mapFiltroReporte!=null){
			if(mapFiltroReporte.get("codigoOficina")!=null){
				sql.append(" and( s.codigo_oficina='"+((Valor)mapFiltroReporte.get("codigoOficina")).getCodigo()+"')");
			}
			if(mapFiltroReporte.get("codigoTerritorio")!=null){
				sql.append(" and( s.codigo_region_territorio='"+((Valor)mapFiltroReporte.get("codigoTerritorio")).getCodigo() +"')");
			}
			if(mapFiltroReporte.get("segmento")!=null){
				sql.append(" and( s.segmento='"+((Segmento)mapFiltroReporte.get("segmento")).getId().toString() +"')");
			}
			
			if(mapFiltroReporte.get("producto")!=null){
				sql.append(" and( o.producto='"+ ((Producto)mapFiltroReporte.get("producto")).getId().toString()+"')");
			}
			if(mapFiltroReporte.get("moneda")!=null){
				sql.append(" and( o.moneda='"+ ((Valor)mapFiltroReporte.get("moneda")).getId().toString() + "')");
			}
			if(mapFiltroReporte.get("fechaRegistroDesde")!=null&&mapFiltroReporte.get("fechaRegistroHasta")!=null){
				Calendar desde=Calendar.getInstance();
				desde.setTime((Date)mapFiltroReporte.get("fechaRegistroDesde"));
				desde.set(Calendar.HOUR_OF_DAY, 00);
				desde.set(Calendar.MINUTE, 00);
				desde.set(Calendar.SECOND, 00);
				desde.set(Calendar.MILLISECOND, 000);
				Calendar hasta=Calendar.getInstance();
				hasta.setTime((Date)mapFiltroReporte.get("fechaRegistroHasta"));
				hasta.set(Calendar.HOUR_OF_DAY, 23);
				hasta.set(Calendar.MINUTE, 59);
				hasta.set(Calendar.SECOND, 59);
				hasta.set(Calendar.MILLISECOND, 999);
				sql.append(" and (o.creacion between TO_DATE('"+ fmt.format(desde.getTime()).toString() +" 00:00:00','DD/MM/YY HH24:MI:SS')  and TO_DATE('"+ fmt.format(hasta.getTime()).toString() +" 23:59:59','DD/MM/YY HH24:MI:SS')) ");
			}
			if(mapFiltroReporte.get("situacion")!=null){
				sql.append(" and ( o.situacion='"+ ((Situacion)mapFiltroReporte.get("situacion")).getId().toString() + "')");
			}
			if(StringUtils.isNotBlank((String)mapFiltroReporte.get("montoCreditoDesde"))&&StringUtils.isNotBlank((String)mapFiltroReporte.get("montoCreditoHasta"))){
				sql.append("and (o.monto_credito between '"+ (String)mapFiltroReporte.get("montoCreditoDesde") +"' and '"+(String)mapFiltroReporte.get("montoCreditoHasta") +"' )");
			}
			if(StringUtils.isNotBlank((String)mapFiltroReporte.get("plazoDesde"))&&StringUtils.isNotBlank((String)mapFiltroReporte.get("plazoHasta"))){
				sql.append("and (o.plazo between '"+ (String)mapFiltroReporte.get("plazoDesde") +"' and '"+(String)mapFiltroReporte.get("plazoHasta") +"' )");
			}
			if(mapFiltroReporte.get("tipoPlazo")!=null){
				sql.append("and (o.tipo_plazo='"+ ((Valor)mapFiltroReporte.get("tipoPlazo")).getId().toString() + "')");
			}
			if(mapFiltroReporte.get("fechaEnvioPreciosDesde")!=null&&mapFiltroReporte.get("fechaEnvioPreciosHasta")!=null){
				Calendar desde=Calendar.getInstance();
				desde.setTime((Date)mapFiltroReporte.get("fechaEnvioPreciosDesde"));
				desde.set(Calendar.HOUR_OF_DAY, 00);
				desde.set(Calendar.MINUTE, 00);
				desde.set(Calendar.SECOND, 00);
				desde.set(Calendar.MILLISECOND, 000);
				Calendar hasta=Calendar.getInstance();
				hasta.setTime((Date)mapFiltroReporte.get("fechaEnvioPreciosHasta"));
				hasta.set(Calendar.HOUR_OF_DAY, 23);
				hasta.set(Calendar.MINUTE, 59);
				hasta.set(Calendar.SECOND, 59);
				hasta.set(Calendar.MILLISECOND, 999);
				sql.append(" and (o.fecha_envio_precios between TO_DATE('"+ fmt.format(desde.getTime()).toString() +" 00:00:00','DD/MM/YY HH24:MI:SS')  and TO_DATE('"+ fmt.format(hasta.getTime()).toString() +" 23:59:59','DD/MM/YY HH24:MI:SS')) ");
			}
			if(mapFiltroReporte.get("fechaDictamenDesde")!=null&&mapFiltroReporte.get("fechaDictamenHasta")!=null){
				Calendar desde=Calendar.getInstance();
				desde.setTime((Date)mapFiltroReporte.get("fechaDictamenDesde"));
				desde.set(Calendar.HOUR_OF_DAY, 00);
				desde.set(Calendar.MINUTE, 00);
				desde.set(Calendar.SECOND, 00);
				desde.set(Calendar.MILLISECOND, 000);
				Calendar hasta=Calendar.getInstance();
				hasta.setTime((Date)mapFiltroReporte.get("fechaDictamenHasta"));
				hasta.set(Calendar.HOUR_OF_DAY, 23);
				hasta.set(Calendar.MINUTE, 59);
				hasta.set(Calendar.SECOND, 59);
				hasta.set(Calendar.MILLISECOND, 999);
				sql.append(" and (o.fecha_dictamen between TO_DATE('"+ fmt.format(desde.getTime()).toString() +" 00:00:00','DD/MM/YY HH24:MI:SS')  and TO_DATE('"+ fmt.format(hasta.getTime()).toString() +" 23:59:59','DD/MM/YY HH24:MI:SS')) ");
			}
			
			if(mapFiltroReporte.get("tipoPrecio")!=null){
				
				if(mapFiltroReporte.get("tipoPrecio").toString().equals("1")){
					if(StringUtils.isNotBlank((String)mapFiltroReporte.get("teaDesde"))&&StringUtils.isNotBlank((String)mapFiltroReporte.get("teaHasta"))){
						sql.append(" and (o.tea_final between '"+ (String)mapFiltroReporte.get("teaDesde") +"' and '"+(String)mapFiltroReporte.get("teaHasta") +"' )");
					}
					if(StringUtils.isNotBlank((String)mapFiltroReporte.get("rarDesde"))&&StringUtils.isNotBlank((String)mapFiltroReporte.get("rarHasta"))){
						sql.append(" and (o.rar_final between '"+ (String)mapFiltroReporte.get("rarDesde") +"' and '"+(String)mapFiltroReporte.get("rarHasta") +"' )");
						
					}
				}
				if(mapFiltroReporte.get("tipoPrecio").toString().equals("2")){
					if(StringUtils.isNotBlank((String)mapFiltroReporte.get("teaDesde"))&&StringUtils.isNotBlank((String)mapFiltroReporte.get("teaHasta"))){
						sql.append(" and (o.tea_evaluar between '"+ (String)mapFiltroReporte.get("teaDesde") +"' and '"+(String)mapFiltroReporte.get("teaHasta") +"' )");
					}	
					if(StringUtils.isNotBlank((String)mapFiltroReporte.get("rarDesde"))&&StringUtils.isNotBlank((String)mapFiltroReporte.get("rarHasta"))){
						sql.append(" and (o.rar_evaluar between '"+ (String)mapFiltroReporte.get("rarDesde") +"' and '"+(String)mapFiltroReporte.get("rarHasta") +"' )");
					}
				}
				if(mapFiltroReporte.get("tipoPrecio").toString().equals("3")){
					if(StringUtils.isNotBlank((String)mapFiltroReporte.get("teaDesde"))&&StringUtils.isNotBlank((String)mapFiltroReporte.get("teaHasta"))){
						sql.append(" and (o.tea_dictaminar between '"+ (String)mapFiltroReporte.get("teaDesde") +"' and '"+(String)mapFiltroReporte.get("teaHasta") +"' )");
					}
					if(StringUtils.isNotBlank((String)mapFiltroReporte.get("rarDesde"))&&StringUtils.isNotBlank((String)mapFiltroReporte.get("rarHasta"))){
						sql.append(" and (o.rar_dictaminar between '"+ (String)mapFiltroReporte.get("rarDesde") +"' and '"+(String)mapFiltroReporte.get("rarHasta") +"' )");
					}
				}
				if(mapFiltroReporte.get("tipoPrecio").toString().equals("4")){
					if(StringUtils.isNotBlank((String)mapFiltroReporte.get("teaDesde"))&&StringUtils.isNotBlank((String)mapFiltroReporte.get("teaHasta"))){
						sql.append(" and (o.tea_min between '"+ (String)mapFiltroReporte.get("teaDesde") +"' and '"+(String)mapFiltroReporte.get("teaHasta") +"' )");
					}
					if(StringUtils.isNotBlank((String)mapFiltroReporte.get("rarDesde"))&&StringUtils.isNotBlank((String)mapFiltroReporte.get("rarHasta"))){
						sql.append(" and (o.rar_min between '"+ (String)mapFiltroReporte.get("rarDesde") +"' and '"+(String)mapFiltroReporte.get("rarHasta") +"' )");
					}
				}
				
			}
		}
		if(mapFiltroTabla!=null){
			if(StringUtils.isNotBlank((String)mapFiltroTabla.get("nroSolicitud"))){
				sql.append(" and( s.numero like UPPER('%"+ (String)mapFiltroTabla.get("nroSolicitud") +"%'))");
			}
			if(StringUtils.isNotBlank((String)mapFiltroTabla.get("segmento"))){
				sql.append(" and( UPPER(seg.nombre) like UPPER('%"+ (String)mapFiltroTabla.get("segmento") +"%'))");
			}
			if(StringUtils.isNotBlank((String)mapFiltroTabla.get("tipoDOI"))){
				sql.append(" and( UPPER(doi.nombre) like UPPER('%"+ (String)mapFiltroTabla.get("tipoDOI") +"%'))");
			}
			if(StringUtils.isNotBlank((String)mapFiltroTabla.get("codigoCentral"))){
				sql.append(" and( UPPER(cli.codigo_central) like UPPER('%"+ (String)mapFiltroTabla.get("codigoCentral") +"%'))");
			}
//			nombre cliente
			if(mapFiltroTabla.get("cliente")!=null){
				sql.append(" and( UPPER(cli.nombres||' '||cli.paterno||' '||cli.materno) like UPPER('%"+ (String)mapFiltroTabla.get("cliente") +"%'))");
			}
			
			if(StringUtils.isNotBlank((String)mapFiltroTabla.get("territorio"))){
				sql.append(" and( UPPER(s.nombre_region_territorio) like UPPER('%"+ (String)mapFiltroTabla.get("territorio") +"%'))");
			}
			if(StringUtils.isNotBlank((String)mapFiltroTabla.get("oficinaCodigo"))){
				sql.append(" and( UPPER(s.codigo_oficina) like UPPER('%"+ (String)mapFiltroTabla.get("oficinaCodigo") +"%'))");
			}
			if(StringUtils.isNotBlank((String)mapFiltroTabla.get("oficinaNombre"))){
				sql.append(" and( UPPER(s.nombre_oficina) like UPPER('%"+ (String)mapFiltroTabla.get("oficinaNombre") +"%'))");
			}
			if(StringUtils.isNotBlank((String)mapFiltroTabla.get("situacion"))){
				sql.append(" and( UPPER(sit.nombre) like UPPER('%"+ (String)mapFiltroTabla.get("situacion") +"%'))");
			}
			if(StringUtils.isNotBlank((String)mapFiltroTabla.get("moneda"))){
				sql.append(" and( UPPER(m.nombre) like UPPER('%"+ (String)mapFiltroTabla.get("moneda") +"%'))");
			}
			if(StringUtils.isNotBlank((String)mapFiltroTabla.get("producto"))){
				sql.append(" and( UPPER(p.nombre) like UPPER('%"+ (String)mapFiltroTabla.get("producto") +"%'))");
			}
			
			if(StringUtils.isNotBlank((String)mapFiltroTabla.get("monto_1"))&&StringUtils.isNotBlank((String)mapFiltroTabla.get("monto_2"))){
				sql.append("and (o.monto_credito between '"+ (String)mapFiltroTabla.get("monto_1") +"' and '"+(String)mapFiltroTabla.get("monto_2") +"' )");
			}
			if(StringUtils.isNotBlank((String)mapFiltroTabla.get("plazo"))){
				sql.append(" and( UPPER(o.plazo||' - '||tp.nombre) like UPPER('%"+ (String)mapFiltroTabla.get("plazo") +"%'))");
			}
			
			if(StringUtils.isNotBlank((String)mapFiltroTabla.get("cuotaInicial_1"))&&StringUtils.isNotBlank((String)mapFiltroTabla.get("cuotaInicial_2"))){
				sql.append("and (o.monto_credito between '"+ (String)mapFiltroTabla.get("cuotaInicial_1") +"' and '"+(String)mapFiltroTabla.get("cuotaInicial_2") +"' )");
			}
			if(mapFiltroTabla.get("fechaRegistro_1")!=null&&mapFiltroTabla.get("fechaRegistro_2")!=null){
				Calendar desde=Calendar.getInstance();
				desde.setTime((Date)mapFiltroTabla.get("fechaRegistro_1"));
				desde.set(Calendar.HOUR_OF_DAY, 00);
				desde.set(Calendar.MINUTE, 00);
				desde.set(Calendar.SECOND, 00);
				desde.set(Calendar.MILLISECOND, 000);
				Calendar hasta=Calendar.getInstance();
				hasta.setTime((Date)mapFiltroTabla.get("fechaRegistro_2"));
				hasta.set(Calendar.HOUR_OF_DAY, 23);
				hasta.set(Calendar.MINUTE, 59);
				hasta.set(Calendar.SECOND, 59);
				hasta.set(Calendar.MILLISECOND, 999);
				sql.append(" and (o.creacion between TO_DATE('"+ fmt.format(desde.getTime()).toString() +" 00:00:00','DD/MM/YY HH24:MI:SS')  and TO_DATE('"+ fmt.format(hasta.getTime()).toString() +" 23:59:59','DD/MM/YY HH24:MI:SS')) ");
			}
			if(mapFiltroTabla.get("fechaEnvioPrecio_1")!=null&&mapFiltroTabla.get("fechaEnvioPrecio_2")!=null){
				Calendar desde=Calendar.getInstance();
				desde.setTime((Date)mapFiltroTabla.get("fechaEnvioPrecio_1"));
				desde.set(Calendar.HOUR_OF_DAY, 00);
				desde.set(Calendar.MINUTE, 00);
				desde.set(Calendar.SECOND, 00);
				desde.set(Calendar.MILLISECOND, 000);
				Calendar hasta=Calendar.getInstance();
				hasta.setTime((Date)mapFiltroTabla.get("fechaEnvioPrecio_2"));
				hasta.set(Calendar.HOUR_OF_DAY, 23);
				hasta.set(Calendar.MINUTE, 59);
				hasta.set(Calendar.SECOND, 59);
				hasta.set(Calendar.MILLISECOND, 999);
				sql.append(" and (o.creacion between TO_DATE('"+ fmt.format(desde.getTime()).toString() +" 00:00:00','DD/MM/YY HH24:MI:SS')  and TO_DATE('"+ fmt.format(hasta.getTime()).toString() +" 23:59:59','DD/MM/YY HH24:MI:SS')) ");
			}
			if(mapFiltroTabla.get("fechaDictamen_1")!=null&&mapFiltroTabla.get("fechaDictamen_2")!=null){
				Calendar desde=Calendar.getInstance();
				desde.setTime((Date)mapFiltroTabla.get("fechaDictamen_1"));
				desde.set(Calendar.HOUR_OF_DAY, 00);
				desde.set(Calendar.MINUTE, 00);
				desde.set(Calendar.SECOND, 00);
				desde.set(Calendar.MILLISECOND, 000);
				Calendar hasta=Calendar.getInstance();
				hasta.setTime((Date)mapFiltroTabla.get("fechaDictamen_2"));
				hasta.set(Calendar.HOUR_OF_DAY, 23);
				hasta.set(Calendar.MINUTE, 59);
				hasta.set(Calendar.SECOND, 59);
				hasta.set(Calendar.MILLISECOND, 999);
				sql.append(" and (o.creacion between TO_DATE('"+ fmt.format(desde.getTime()).toString() +" 00:00:00','DD/MM/YY HH24:MI:SS')  and TO_DATE('"+ fmt.format(hasta.getTime()).toString() +" 23:59:59','DD/MM/YY HH24:MI:SS')) ");
			}
			if(StringUtils.isNotBlank((String)mapFiltroTabla.get("tasaMaxima_1"))&&StringUtils.isNotBlank((String)mapFiltroTabla.get("tasaMaxima_2"))){
				sql.append("and (o.tasa_maxima between '"+ (String)mapFiltroTabla.get("tasaMaxima_1") +"' and '"+(String)mapFiltroTabla.get("tasaMaxima_2") +"' )");
			}
			if(StringUtils.isNotBlank((String)mapFiltroTabla.get("tasaMinima_1"))&&StringUtils.isNotBlank((String)mapFiltroTabla.get("tasaMinima_2"))){
				sql.append("and (o.tasa_minima between '"+ (String)mapFiltroTabla.get("tasaMinima_1") +"' and '"+(String)mapFiltroTabla.get("tasaMinima_2") +"' )");
			}
			if(StringUtils.isNotBlank((String)mapFiltroTabla.get("teaMotor_1"))&&StringUtils.isNotBlank((String)mapFiltroTabla.get("teaMotor_2"))){
				sql.append("and (o.tea_min between '"+ (String)mapFiltroTabla.get("teaMotor_1") +"' and '"+(String)mapFiltroTabla.get("teaMotor_2") +"' )");
			}
			if(StringUtils.isNotBlank((String)mapFiltroTabla.get("rarMotor_1"))&&StringUtils.isNotBlank((String)mapFiltroTabla.get("rarMotor_2"))){
				sql.append("and (o.rar_min between '"+ (String)mapFiltroTabla.get("rarMotor_1") +"' and '"+(String)mapFiltroTabla.get("rarMotor_2") +"' )");
			}
			if(StringUtils.isNotBlank((String)mapFiltroTabla.get("teaSolicitada_1"))&&StringUtils.isNotBlank((String)mapFiltroTabla.get("teaSolicitada_2"))){
				sql.append("and (o.tea_evaluar between '"+ (String)mapFiltroTabla.get("teaSolicitada_1") +"' and '"+(String)mapFiltroTabla.get("teaSolicitada_2") +"' )");
			}
			if(StringUtils.isNotBlank((String)mapFiltroTabla.get("rarSolicitada_1"))&&StringUtils.isNotBlank((String)mapFiltroTabla.get("rarSolicitada_2"))){
				sql.append("and (o.rar_evaluar between '"+ (String)mapFiltroTabla.get("rarSolicitada_1") +"' and '"+(String)mapFiltroTabla.get("rarSolicitada_2") +"' )");
			}
			if(StringUtils.isNotBlank((String)mapFiltroTabla.get("teaDictaminada_1"))&&StringUtils.isNotBlank((String)mapFiltroTabla.get("teaDictaminada_2"))){
				sql.append("and (o.tea_dictaminar between '"+ (String)mapFiltroTabla.get("teaDictaminada_1") +"' and '"+(String)mapFiltroTabla.get("teaDictaminada_2") +"' )");
			}
			if(StringUtils.isNotBlank((String)mapFiltroTabla.get("rarDictaminada_1"))&&StringUtils.isNotBlank((String)mapFiltroTabla.get("rarDictaminada_2"))){
				sql.append("and (o.rar_dictaminar between '"+ (String)mapFiltroTabla.get("rarDictaminada_1") +"' and '"+(String)mapFiltroTabla.get("rarDictaminada_2") +"' )");
			}
			
			if(mapFiltroTabla.get("vigenciaDictamen_1")!=null&&mapFiltroTabla.get("vigenciaDictamen_2")!=null){
				Calendar desde=Calendar.getInstance();
				desde.setTime((Date)mapFiltroTabla.get("vigenciaDictamen_1"));
				desde.set(Calendar.HOUR_OF_DAY, 00);
				desde.set(Calendar.MINUTE, 00);
				desde.set(Calendar.SECOND, 00);
				desde.set(Calendar.MILLISECOND, 000);
				Calendar hasta=Calendar.getInstance();
				hasta.setTime((Date)mapFiltroTabla.get("vigenciaDictamen_2"));
				hasta.set(Calendar.HOUR_OF_DAY, 23);
				hasta.set(Calendar.MINUTE, 59);
				hasta.set(Calendar.SECOND, 59);
				hasta.set(Calendar.MILLISECOND, 999);
				sql.append(" and (o.creacion between TO_DATE('"+ fmt.format(desde.getTime()).toString() +" 00:00:00','DD/MM/YY HH24:MI:SS')  and TO_DATE('"+ fmt.format(hasta.getTime()).toString() +" 23:59:59','DD/MM/YY HH24:MI:SS')) ");
			}
			if(StringUtils.isNotBlank((String)mapFiltroTabla.get("teaFinal_1"))&&StringUtils.isNotBlank((String)mapFiltroTabla.get("teaFinal_2"))){
				sql.append("and (o.tea_final between '"+ (String)mapFiltroTabla.get("teaFinal_1") +"' and '"+(String)mapFiltroTabla.get("teaFinal_2") +"' )");
			}
			if(StringUtils.isNotBlank((String)mapFiltroTabla.get("rarFinal_1"))&&StringUtils.isNotBlank((String)mapFiltroTabla.get("rarFinal_2"))){
				sql.append("and (o.rar_final between '"+ (String)mapFiltroTabla.get("rarFinal_1") +"' and '"+(String)mapFiltroTabla.get("rarFinal_2") +"' )");
			}
			if(StringUtils.isNotBlank((String)mapFiltroTabla.get("costoFondeo_1"))&&StringUtils.isNotBlank((String)mapFiltroTabla.get("costoFondeo_2"))){
				sql.append("and (o.costo_fondeo between '"+ (String)mapFiltroTabla.get("costoFondeo_1") +"' and '"+(String)mapFiltroTabla.get("costoFondeo_2") +"' )");
			}

		}
		List<Map<String, Object>> rows = jdbcTemplate.queryForList(sql.toString());
		List<Operacion> listaOperacion = new ArrayList<Operacion>();
		for (Map<String, Object> map : rows) {
			Segmento segmento = new Segmento();
			segmento.setNombre((String) map.get("SEGMENTO_NOMBRE"));
			
			Producto producto = new Producto();
			producto.setNombre((String)map.get("PRODUCTO_NOMBRE"));
			
			Valor doi = new Valor();
			doi.setNombre((String) map.get("DOI_NOMBRE"));
			
			Valor moneda = new Valor();
			moneda.setNombre((String) map.get("MONEDA_NOMBRE"));
			
			Cliente cliente= new Cliente();
			cliente.setNombres((String) map.get("NOMBRE_CLIENTE"));
			cliente.setCodigoCentral((String) map.get("COD_CENTRAL_CLIENTE"));
			cliente.setTipoDoi(doi);
			
			Situacion situacion = new Situacion();
			situacion.setNombre((String) map.get("NOMBRE_SITUACION"));
			
			Valor tipoPlazo = new Valor();
			tipoPlazo.setNombre((String) map.get("NOMBRE_TIPO_PLAZO"));
			
			Solicitud solicitud = new Solicitud();
			solicitud.setId(((BigDecimal)map.get("ID_SOLICITUD")).longValueExact());
			solicitud.setCodigoOficina((String) map.get("CODIGO_OFICINA"));
			solicitud.setNombreOficina((String) map.get("NOMBRE_OFICINA"));
			solicitud.setCodigoRegionTerritorio((String) map.get("CODIGO_REGION_TERRITORIO"));
			solicitud.setNombreRegionTerritorio((String) map.get("NOMBRE_REGION_TERRITORIO"));
			solicitud.setNumero((String)map.get("NUMERO_SOLICITUD"));
			
			solicitud.setCliente(cliente);
			solicitud.setSegmento(segmento);
			
			
			Operacion operacion = new Operacion();
			operacion.setSolicitud(solicitud);
			operacion.setProducto(producto);
			operacion.setMoneda(moneda);
			
			operacion.setCreacion((Date)map.get("CREACION"));
			operacion.setFechaDictamen((Date)map.get("FECHA_DICTAMEN"));
			operacion.setFechaEnvioPrecio((Date)map.get("FECHA_ENVIO_PRECIOS"));
			operacion.setSituacion(situacion);
			operacion.setTipoPlazo(tipoPlazo);
			operacion.setCuotaInicial((BigDecimal)map.get("CUOTA_INICIAL"));
			operacion.setMontoCredito((BigDecimal)map.get("MONTO_CREDITO"));
			
			operacion.setRarMin((BigDecimal)map.get("RAR_MIN"));
			operacion.setTeaMin((BigDecimal)map.get("TEA_MIN"));
			operacion.setRarFinal((BigDecimal)map.get("RAR_FINAL"));
			operacion.setTeaFinal((BigDecimal)map.get("TEA_FINAL"));
			operacion.setRarEvaluar((BigDecimal)map.get("RAR_EVALUAR"));
			operacion.setTeaEvaluar((BigDecimal)map.get("TEA_EVALUAR"));
			operacion.setRarDictaminar((BigDecimal)map.get("RAR_DICTAMINAR"));
			operacion.setTeaDictaminar((BigDecimal)map.get("TEA_DICTAMINAR"));
			operacion.setFechaVigenciaTasa((Date) map.get("FECHA_VIGENCIA_TASA"));
			operacion.setCostoFondeo((BigDecimal)map.get("COSTO_FONDEO"));
			
			operacion.setCr((BigDecimal)map.get("CR"));
			operacion.setPe((BigDecimal)map.get("PE"));
			operacion.setValorComercialActual((BigDecimal)map.get("VALOR_COMERCIAL_ACTUAL"));
			operacion.setValorComercialPotencial((BigDecimal)map.get("VALOR_COMERCIAL_POTENCIAL"));
			operacion.setValorCliente((BigDecimal)map.get("VALOR_CLIENTE"));
			operacion.setScoreVinculadoRar((BigDecimal)map.get("SCORE_VINCULADO_RAR"));
			operacion.setTasaMinima((BigDecimal)map.get("TASA_MINIMA"));
			operacion.setTasaMaxima((BigDecimal)map.get("TASA_MAXIMA"));
			operacion.setTeaDictaminar((BigDecimal)map.get("TEA_DICTAMINAR"));
			operacion.setRarDictaminar((BigDecimal)map.get("RAR_DICTAMINAR"));
			operacion.setTeaFinal((BigDecimal)map.get("TEA_FINAL"));
			operacion.setRarFinal((BigDecimal)map.get("RAR_FINAL"));
			operacion.setReglaError((String)map.get("REGLA_ERROR"));
			
			listaOperacion.add(operacion);
		}
		return listaOperacion;
	}

	@Override
	public List<Operacion> buscarOperacionesConcretadas(Date primerDiaDelMes,Date ultimoDiaDelMes, String string) {
		return buscarHql("Select o from Operacion o where situacion.codigo='CON'  and edicion >=? and edicion <= ?",primerDiaDelMes,ultimoDiaDelMes);
	}
	
}






	
	
